package Day30;

/**
 * ----------------------------------------------------------------------------------------------
 * 题目：
 *      给出一棵二叉树，其上每个结点的值都是0或1。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
 *      例如，如果路径为0 -> 1 -> 1 -> 0 -> 1，那么它表示二进制数01101，也就是13。
 *      对树上的每一片叶子，我们都要找出从根到该叶子的路径所表示的数字。
 *      返回这些数字之和。题目数据保证答案是一个 32 位 整数。
 * ----------------------------------------------------------------------------------------------
 * 示例：
 *      输入：root = [1,0,1,0,1,0,1]
 *      输出：22
 *      解释：(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22
 * ----------------------------------------------------------------------------------------------
 * 方法：
 *      深度优先搜索
 * ----------------------------------------------------------------------------------------------
 */

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

class Solution {
    public static void main(String[] args) {
        System.out.println(1);
    }
    public int sumRootToLeaf(TreeNode root) {
        return dfs(root, 0);
    }

    public int dfs(TreeNode root, int val) {
        if (root == null) {
            return 0;
        }
        val = (val << 1) | root.val;
        if (root.left == null && root.right == null) {
            return val;
        }
        return dfs(root.left, val) + dfs(root.right, val);
    }
}